package io01;

import java.io.FileOutputStream;
import java.io.IOException;

/**
 * IO:Input和Output，即：输入与输出
 *
 * Java将输入和输出用"流Stream"表达，分为输入流和输出流
 * 我们可以将它们想象为连接我们的程序和另一个设备之间的"管道"，通过它们可以读写设备
 * Java将输入流和输出流定义了两个对应的超类InputStream和OutputStream
 * 1)InputStream:输入流，方向是从外界到程序的方向，用于读取数据的流，是一个抽象类，定义了读取字节的相关方法
 * 2)OutputStream:输出流，方向是从程序到外界的方向，用于写成数据的流，是一个抽象类，定义了写出字节的相关方法
 *
 * 文件流:FileInputStream和FileOutputStream
 * 文件流继承自InputStream和OutputStream，用于对文件进行读写操作
 */
public class FOSDemo {
    public static void main(String[] args) throws IOException {
        /*
        文件输出流两个常用的构造器：
        1)FileOutputStream(String fileName)
        2)FileOutputStream(File file)
        文件流创建时如果指定的文件不存在则会自动创建，前提是该文件所在的目录必须存在，若不存在则发生异常
         */
        //File file = new File("fos.dat");
        //FileOutputStream fos = new FileOutputStream(file); //根据File实例定义文件输出流
        FileOutputStream fos = new FileOutputStream("fos.dat",true); //定义文件输出流,true可以追加，这样写入就不会覆盖掉之前的内容

        fos.write(3); //向fos.dat中写入1个字节
        fos.write(5); //向fos.dat中又写入1个字节
        /*
        void write(int d):通过该输出流向目标位置写出1个字节，写出的是给定的int值对应的2进制的"低八位"
        当fos.write(3);时向fos.dat中写入了1个字节
        int值1的2进制样子：00000000 00000000 00000000 00000011
                                                   ^^^^^^^^
                                                   写入该字节
        write()后，fos.dat文件内容(长度为1字节):
        00000011

        当fos.write(5);时，又向fos.dat中写入了1个字节
        int值2的2进制样子：00000000 00000000 00000000 00000101
                                                   ^^^^^^^^
                                                   写入该字节
        write()后，fos.dat文件内容(长度为2字节):
        00000011 00000101
        */

        //fos.write(-1);
        /*
        当fos.write(-1);时，向fos.dat中写入了1个字节
        int值-1的2进制样子：00000000 00000000 00000000 11111111
                                                    ^^^^^^^^
                                                    写入该字节
        write()后，fos.dat文件内容(长度为1字节):
        11111111
         */
        System.out.println("写出完毕！");
        fos.close(); //关闭流，流用完了都要关
    }
}
